﻿using Microsoft.EntityFrameworkCore;
using System.Data;
using System.Text;

namespace Sgr.Exceptions
{
    public class EfDbExceptionHandler : IExceptionHandler
    {
        public bool TryTranslate(Exception exception, ref string message)
        {
            if (exception is DbUpdateException dbUpdateException)
            {
                //DBConcurrencyException
                //DbUpdateConcurrencyException
                var sb = new StringBuilder();
                sb.AppendLine("数据并发更新异常，该数据已被其他用户修改");

                // 获取冲突的实体信息
                foreach (var entry in dbUpdateException.Entries)
                {
                    sb.AppendLine($"实体类型: {entry.Entity.GetType().Name}");

                    // 尝试获取实体的主键值
                    var keyValues = entry.Metadata.FindPrimaryKey()?.Properties
                        .Select(p => $"{p.Name}: {entry.Property(p.Name).CurrentValue}")
                        .ToList();

                    if (keyValues != null && keyValues.Any())
                    {
                        sb.AppendLine($"主键: {string.Join(", ", keyValues)}");
                    }

                    //// 获取原始值和当前数据库值
                    //var conflicts = entry.Properties
                    //    .Where(p => p.IsModified && p.OriginalValue != null && !Equals(p.OriginalValue, p.CurrentValue))
                    //    .Select(p => $"{p.Metadata.Name}: 原值={p.OriginalValue}, 当前值={p.CurrentValue}")
                    //    .ToList();

                    //if (conflicts.Any())
                    //{
                    //    sb.AppendLine("冲突属性:");
                    //    foreach (var conflict in conflicts)
                    //    {
                    //        sb.AppendLine($"  - {conflict}");
                    //    }
                    //}
                }

                message = sb.ToString();
                return true;
            }

            return false;
        }
    }
}